package controller;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.AbstractButton;

import controller.states.UserGeneralStateListener;

import errors.DimensionNotAcceptableException;
import event.numberevent.NumberEvent;

/**gestisce un pulsante astratto (di qualunque genere e tipo) all'interno della
 * grafica
 * 
 * @author Koldar
 * @version 1.0 
 *
 */
public abstract class AbstractButtonController extends Controller implements ActionListener,UserGeneralStateListener{

	/**rappresenta il pulsante che viene ascoltato dal Controller*/
	protected AbstractButton listenedButton;
	
	/**crea il nuovo Controller in modo che ascolti lo <tt>userMode</tt>
	 * 
	 */
	protected AbstractButtonController(AbstractButton button){
		this.listenedButton=button;
		this.userMode.addNumberListener(this);
		this.listenedButton.addActionListener(this);
	}
	
	/**imposta lo stato dell'applicazione al valore IDLE
	 * 
	 */
	public void setToIdle(){
		this.userMode.setValue(IDLE);
	}
	/**imposta lo stato dell'applicazione al valore EDIT
	 * 
	 */
	protected void setToEdit(){
		this.userMode.setValue(EDIT);
	}
	
	/**imposta lo stato dell'applicazione a IDLE
	 * 
	 */
	@Override
	public void startUserState(NumberEvent<Integer> arg0) {
		this.setToIdle();
	}

	/**attiva il {@link #listenedButton}, se assume un valore diverso
	 * da NULL
	 * 
	 */
	@Override
	public void idleUserState(NumberEvent<Integer> arg0) {
		this.listenedButton.setEnabled(true);
	}

	/**disattiva il {@link #listenedButton}, se assume un valore
	 * diverso da NULL
	 * 
	 */
	@Override
	public void editUserState(NumberEvent<Integer> arg0) {
		this.listenedButton.setEnabled(false);
	}
	@Override
	public void actionPerformed(ActionEvent arg0){
		try{
			this.setToEdit();
			this.wizardInizializer(arg0);
		}catch(NullStaticObjectException | DimensionNotAcceptableException error){
			error.printStackTrace();
			System.exit(-1);
		}
	}
	/**rappresenta la lista di istruzioni che vengono eseguite qualora il
	 * pulsante ascoltato da questo controller venga premuto.
	 * <p>Il pulsante spedisce un evento di tipo ActionEvent; tramite esso
	 * lo stato dell'applicazione passa da IDLE a EDIT, quindi si procede
	 * ad eseguire la lista di istruzioni specificata da questo metodo.
	 * <p>Questo metodo, dato che molto probabilmente usera' attributi del Controller,
	 * puo' lanciare NullStaticObjectException e per questo ha un protocollo che
	 * ingloba questa possibilita'
	 * 
	 * @param arg0 l'evento che ha spedito il {@link #listenedButton} a questo controller
	 * @throws NullStaticObjectException in caso in cui alcuni oggetti del Controller utilizzati in questo metodo non siano stati ancora cablati7
	 * @throws DimensionNotAcceptableException in caso vengano inseriti dei valori non conformi alla mappa
	 */
	public abstract void wizardInizializer(ActionEvent arg0)throws NullStaticObjectException, DimensionNotAcceptableException;
}
